package com.atguigu.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * 1、整合mybatis——puls
 *  1）导入依赖
 *  2）配置
 *      a、配置数据源
 *          导入数据库的驱动
 *          在application.yml配置数据源相关的信息
 *      b、配置mybatis-puls
 *          使用MapperScan
 *          告诉mybatis-plus  sql的映射文件位置
 * 2、使用逻辑删除
 *  1)、配置全局的逻辑删除规则（可省略）
 *  2）、配置逻辑删除的组件（可省略）
 *  3）、给标志属性加上逻辑删除注解 @TableLogic
 *
 *
 * 3、JR303
 *  1）、给Bean添加校验注解：注解格式在javax.validation.constraints,并定义自己的message
 *  2）、开启校验功能，在需要校验的controller的变量名之前加入@Valid注解
 *      会出现默认的相应规则
 *  3)、可以在controller的变量名之后紧跟一个变量BindingResult，就可以获取到校验的结果
 *  4）、分组校验:（多场景的复杂校验）
 *       （1）、 @NotBlank(message = "品牌名不能为空！",groups = {AddGroup.class,UpdateGroup.class})
 *              给校验注解标注什么情况下需要进行校验
 *        (2)、给需要校验的方法参数栏最前面加上@Validated({AddGroup.class})，指定分组
 *        (3)、默认没有指定分组的校验注解@NotBlack，只会在@Validated没有指定分组的时候生效
 *              当@Validated没有指定分组的时候，所有没有指定分组的校验注解会生效，同时所有指定了分组的校验注解会失效
 *  5）、自定义校验
 *      (1)、编写一个自定义的校验注解
 *      (2)、编写一个自定义的校验器
 *      (3)、关联校验注解和校验器
 *      在校验注解里边配置以下内容
 *      @Documented
 *      @Constraint(
 *         validatedBy = {ListValueConstrainValidator.class（可以指定多个校验器用来适配不同的校验规则）}
 *       )
 *      @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
 *      @Retention(RetentionPolicy.RUNTIME)
 *
 * 4、统一的异常处理
 * @ControllerAdvice
 *  1）、编写异常类，使用@ControllerAdvice;
 *  2）、使用@ExceptionHandler标注方法可以处理异常
 *
 *
 *
 *
 */
@EnableFeignClients(basePackages = "com.atguigu.gulimall.product.feign")
@EnableDiscoveryClient
@SpringBootApplication
@MapperScan("com/atguigu/gulimall/product/dao")
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
